#include <bits/stdc++.h>
using namespace std;
//哈希表会导致0的位置变化，直接到最后一个位置了
// int main()
// {
//     string s1,res;cin>>s1;
//     unordered_set<char> us;
//     for(int i=s1.size()-1;i>=0;i--)
//     {
//         if(us.find(s1[i])==us.end())
//         {
//             res+=s1[i];
//             us.insert(s1[i]);
//         }
//     }
//     cout<<res<<endl;
//     return 0;
// }

//写一篇题解
// int main()
// {
//     long long x;cin>>x;
//     //greater是小根堆，less是大根堆
//     priority_queue<long long,vector<long long>,greater<long long>> q;
//     for(int i=0;i<x;i++)
//     {
//         int a;cin>>a;q.push(a);
//     }
//     long long sum=0;
//     while(q.size()>1)
//     {
//         long long a=q.top();q.pop();
//         long long b=q.top();q.pop();
//         q.push(a+b);
//         sum+=a+b;
//     }
//     cout<<sum<<endl;
//     return 0;
// }

//dp[i]表示以i为结尾的子序列中有多少个_xx，和hash1[x]的值是相等的
//hash1[x]更新前表示[0,i-1]中有多少个_x,更新后表示[0,i]中有多少个_x
//hash2[x]更新前表示[0,i-1]中有多少个x,更新后表示[0,i]中有多少个x
int main()
{
    int n;cin>>n;
    string s;cin>>s;
    int hash1[26],hash2[26];
    memset(hash1,0,sizeof(hash1));
    memset(hash2,0,sizeof(hash2));
    long long sum=0;
    for(int i=0;i<s.size();i++)
    {
        int x=s[i]-'a';
        sum+=hash1[x];
        hash1[x]=hash1[x]+i-hash2[x];
        hash2[x]=hash2[x]+1;
    }
    cout<<sum<<endl;
    return 0;
}